//
// Created by jwhww on 25-8-27.
//

#include "key.h"

int state_NVIC_tim_1 = 0;

//按键簇
keyStruct key[4];
keyStruct key_encoder[1];

//------------------------------------------------------------------------------------------------------
// 函数简介     按键检测
// 使用示例     Key_Check(1, key, KEYPIN1_PIN_PORT, KEYPIN1_PIN);
// 参数介绍     num                             第几个按键
// 参数介绍     *key                            按键簇
// 参数介绍     key_pin                         按键位号
// 返回参数     void
// 备注信息     后续给拨码开关写的时候可以新建另一个结构体；
// 备注信息     改变key[num-1].flag = 1语句的位置可以更改按键的确认模式，在case KEY_COMFIRM里是按下确认，在case KEY_UNPRESSED是松手确认
// 备注信息     单独使用key[num-1].flag的话需要手动置零哦~
//------------------------------------------------------------------------------------------------------
void Key_Check(int num, keyStruct *key, GPIO_TypeDef *key_pin_port, uint16_t key_pin){
    switch (key[num-1].state){

        case KEY_CHECK:
            //读到高电平，进入按键确认状态
            if(HAL_GPIO_ReadPin(key_pin_port, key_pin) == RESET){
                key[num-1].state = KEY_COMFIRM;
            }
            break;

        case KEY_COMFIRM:
            //中断时间内再读到一次高电平，才确认是按键按下（防误触）， 进入释放状态
            if(HAL_GPIO_ReadPin(key_pin_port, key_pin) == RESET){
                key[num-1].state = KEY_UNPRESSED;

                // key[num-1].flag = 1;    //按下确认(未开启）
            } else {
                //第二次如果读到低电平，那认为干扰信号或者误触，返回初始状态
                key[num-1].state = KEY_CHECK;
            }
            break;

        case KEY_UNPRESSED:
            //读到低电平，说明按键释放，返回初始状态
            if (HAL_GPIO_ReadPin(key_pin_port, key_pin) == SET){
                key[num-1].state = KEY_CHECK;

                key[num-1].flag = 1;    //松手确认
            }

    }
}

//------------------------------------------------------------------------------------------------------
// 函数简介     按键检测大全
// 使用示例     Key_Check_All();
// 返回参数     void
// 备注信息
// 备注信息
//------------------------------------------------------------------------------------------------------
void Key_Check_All(void){
    //按钮轮询
    if(state_NVIC_tim_1){
        Key_Check(1, key, KEYPIN1_PIN_PORT, KEYPIN1_PIN);

        // Key_Check(1, key_encoder, KEY_ENCODER);

        state_NVIC_tim_1 = 0;
    }
}


//------------------------------------------------------------------------------------------------------
// 函数简介     按键处理
// 使用示例     Key_1_Job();
// 返回参数     void
// 备注信息     按下按键处理的函数写在这里
// 按键4
// 按键3
// 按键2
// 按键1       外置按钮，按下清屏，再按亮屏
// 编码器旋钮    小转一下轮子
//------------------------------------------------------------------------------------------------------
uint8_t state_key_1 = 0;
//外置按钮，按下清理右下角
void Key_1_Job (void){
    if (key[0].flag == 1){
        //code start
        state_key_1++;
        state_key_1 %= 4;
        //code end
        key[0].flag = 0;
    }
    if(state_key_1 == 1){
        OLED_All_Clear();
        state_key_1++;
    }
    else if (state_key_1 == 3) {
        OLED_ALL_ON();
        state_key_1++;
    }


}